///*******************************************************************************
// * Copyright (c) 2005, 2006 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// *     IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.ui.tests.api;
//
//import java.util.Iterator;
//import java.util.List;
//
//import org.eclipse.core.runtime.IStatus;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.widgets.Button;
//import org.eclipse.ui.IMemento;
//import org.eclipse.ui.IWorkbenchPreferenceConstants;
//import org.eclipse.ui.IWorkbenchWindow;
//import org.eclipse.ui.XMLMemento;
//import org.eclipse.ui.internal.IWorkbenchConstants;
//import org.eclipse.ui.internal.WindowTrimProxy;
//import org.eclipse.ui.internal.WorkbenchWindow;
//import org.eclipse.ui.internal.layout.ITrimManager;
//import org.eclipse.ui.internal.layout.IWindowTrim;
//import org.eclipse.ui.internal.util.PrefUtil;
//import org.eclipse.ui.tests.harness.util.UITestCase;
//
///**
// * Test to exercise the trim layout save/restore/modify support.
// * 
// * @since 3.2
// */
//public class TrimLayoutTest extends UITestCase {
//
//	private static final String BUTTON_B_ID = "my.button.b";
//
//	public static final String[] TOP_TRIM_LIST = {
//			"org.eclipse.ui.internal.WorkbenchWindow.topBar",
//			TrimList.TRIM_LIST_ID };
//
//	public static final String[] TOP_BUTTON_TRIM = {
//			"org.eclipse.ui.internal.WorkbenchWindow.topBar", BUTTON_B_ID,
//			TrimList.TRIM_LIST_ID };
//
//	private boolean fHeapStatusPref;
//
//	/**
//	 * @param testName
//	 */
//	public TrimLayoutTest(String testName) {
//		super(testName);
//	}
//
//	/**
//	 * Will test that the trim area IDs are returned.
//	 * 
//	 * @throws Throwable
//	 */
//	public void testGetIDs() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();
//		int[] ids = trimManager.getAreaIds();
//		assertEquals("number of trim areas", 4, ids.length);
//	}
//
//	/**
//	 * Test the basic trim layout of a workbench window.
//	 * 
//	 * @throws Throwable
//	 *             on error
//	 */
//	public void testTrimInformation() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();		
//		validateDefaultBottomLayout(trimManager);
//	}
//
//	/**
//	 * Swap the status line with the ProgressRegion, and check that the control
//	 * order has been updated.
//	 * 
//	 * @throws Throwable
//	 */
//	public void testMoveStatusLine() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();		
//		validateDefaultBottomLayout(trimManager);
//		
//		// Capture the ids of the 1st and 3rd elements
//		List trim = trimManager.getAreaTrim(SWT.BOTTOM);		
//		String id1 = ((IWindowTrim) trim.get(1)).getId();
//		String id3 = ((IWindowTrim) trim.get(3)).getId();
//
//		// Swap the first and third trim elements
//		swapPostition(trim, 1, 3);
//		trimManager.updateAreaTrim(ITrimManager.BOTTOM, trim, false);
//		window.getShell().layout(true, true);
//
//		// Check the swap
//		trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
//		assertTrue("element failed to swap", getIndexOf(trim, id1) == 3);
//		assertTrue("element failed to swap", getIndexOf(trim, id3) == 1);
//	}
//
//	/**
//	 * Swap the fast view bar and the progress region, and then check that the
//	 * controls have been updated.
//	 * 
//	 * @throws Throwable
//	 */
//	public void testMoveFastViewBar() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();				
//		validateDefaultBottomLayout(trimManager);
//		
//		// Capture the ids of the 1st and 3rd elements
//		List trim = trimManager.getAreaTrim(SWT.BOTTOM);		
//		String id0 = ((IWindowTrim) trim.get(0)).getId();
//		String id3 = ((IWindowTrim) trim.get(3)).getId();
//
//		// Swap the zero'th and third trim elements
//		swapPostition(trim, 0, 3);
//		trimManager.updateAreaTrim(ITrimManager.BOTTOM, trim, false);
//		window.getShell().layout(true, true);
//
//		// Check the swap
//		trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
//		assertTrue("element failed to swap", getIndexOf(trim, id0) == 3);
//		assertTrue("element failed to swap", getIndexOf(trim, id3) == 0);
//	}
//
//	/**
//	 * This test isn't really about removing trim, just testing that the if the
//	 * heap status trim is not in the trim list, it's removed from the bottom
//	 * trim area.
//	 * 
//	 * @throws Throwable
//	 *             on error
//	 */
//	public void testRemoveHeapStatus() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();		
//		validateDefaultBottomLayout(trimManager);
//
//		// Remove the Heap Status
//		List trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
//		int hsIndex = getIndexOf(trim, "org.eclipse.ui.internal.HeapStatus");
//		trim.remove(hsIndex);
//		trimManager.updateAreaTrim(ITrimManager.BOTTOM, trim, true);
//		window.getShell().layout(true, true);
//
//		// Make sure that its gone
//		trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
//		hsIndex = getIndexOf(trim, "org.eclipse.ui.internal.HeapStatus");
//		assertTrue("HeapStatus failed to remove", hsIndex == -1);
//	}
//
//	/**
//	 * Test the public API to add a piece of trim to the end of the trim area.
//	 * 
//	 * @throws Throwable
//	 */
//	public void testAddExtraTrim() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();
//		assertTrue(
//				"The window should have it's top banner in place",
//				trimManager
//						.getTrim("org.eclipse.ui.internal.WorkbenchWindow.topBar") != null);
//		
//		TrimList trimList = new TrimList(window.getShell());
//		trimManager.addTrim(ITrimManager.TOP, trimList);
//		window.getShell().layout();
//
//		List trim = trimManager.getAreaTrim(ITrimManager.TOP);
//		validatePositions(TOP_TRIM_LIST, trim);
//	}
//
//	/**
//	 * Test the public API to add a piece of trim before an existing piece of
//	 * trim.
//	 * 
//	 * @throws Throwable
//	 */
//	public void testPlaceExtraTrim() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();
//		TrimList trimList = new TrimList(window.getShell());
//		trimManager.addTrim(ITrimManager.TOP, trimList);
//
//		// WindowTrimProxy is an internal "quick and dirty" way
//		// to just provide a control to the trim ... not public API
//		Button b = new Button(window.getShell(), SWT.PUSH);
//		b.setText("B");
//		IWindowTrim buttonTrim = new WindowTrimProxy(b, BUTTON_B_ID,
//				"Button B", SWT.TOP | SWT.BOTTOM, false);
//		
//		// find an existing piece of trim to use as a reference
//		IWindowTrim trim = trimManager.getTrim(TrimList.TRIM_LIST_ID);
//		assertTrue(trimList == trim);
//		trimManager.addTrim(ITrimManager.TOP, buttonTrim, trim);
//		window.getShell().layout();
//
//		List topTrim = trimManager.getAreaTrim(ITrimManager.TOP);
//		validatePositions(TOP_BUTTON_TRIM, topTrim);
//	}
//
//	/**
//	 * Test that the save-state is recording trim layout.
//	 * 
//	 * @throws Throwable
//	 */
//	public void testSaveWorkbenchWindow() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//
//		XMLMemento state = XMLMemento
//				.createWriteRoot(IWorkbenchConstants.TAG_WINDOW);
//		IStatus rc = window.saveState(state);
//		assertEquals(IStatus.OK, rc.getSeverity());
//
//		IMemento trim = state.getChild(IWorkbenchConstants.TAG_TRIM);
//		assertNotNull(trim);
//
//		int[] ids = window.getTrimManager().getAreaIds();
//		IMemento[] children = trim
//				.getChildren(IWorkbenchConstants.TAG_TRIM_AREA);
//		assertTrue("Should have <= " + ids.length + " trim areas",
//				children.length <= ids.length);
//		assertEquals("Our trim configuration starts with", 2, children.length);
//	}
//
//	/**
//	 * Test that the workbench window can restore trim state from an
//	 * <code>IMemento</code>.
//	 * 
//	 * @throws Throwable
//	 */
//	public void testRestoreStateWithChange() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();
//		validateDefaultBottomLayout(trimManager);
//		
//		int bottomTrimCount = trimManager.getAreaTrim(SWT.BOTTOM).size();
//		
//		// Create a memento and write the state to it...
//		XMLMemento state = XMLMemento
//				.createWriteRoot(IWorkbenchConstants.TAG_WINDOW);
//		IStatus rc = window.saveState(state);
//		
//		// Did the save work?
//		assertEquals(IStatus.OK, rc.getSeverity());
//		
//		// Does it have the right info?
//		IMemento trimMemento = state.getChild(IWorkbenchConstants.TAG_TRIM);
//		assertNotNull(trimMemento);
//
//		// Is the child content the same
//		IMemento[] children = trimMemento
//				.getChildren(IWorkbenchConstants.TAG_TRIM_AREA);
//		int childIdx = 0;
//		IMemento bottomTrim = null;
//		String bottomId = new Integer(SWT.BOTTOM).toString();
//
//		// Find the 'bottom' trim
//		for (; childIdx < children.length; childIdx++) {
//			if (children[childIdx].getID().equals(bottomId)) {
//				bottomTrim = children[childIdx];
//				break;
//			}
//		}
//		assertNotNull(bottomTrim);
//
//		// Make sure we have the right number of entries
//		children = bottomTrim.getChildren(IWorkbenchConstants.TAG_TRIM_ITEM);
//		assertEquals(bottomTrimCount, children.length);
//
//		// 'swap' the 0 and 3 trim using only the stored ids
//		String id0 = children[0].getID();
//		String id3 = children[3].getID();
//		children[0].putString(IMemento.TAG_ID, id3);
//		children[3].putString(IMemento.TAG_ID, id0);
//
//		// Restore the trim from the modified state
//		window.restoreState(state, window.getActivePage().getPerspective());
//		window.getShell().layout(true, true);
//
//		List trim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
//		assertTrue("Restore has wrong layout", getIndexOf(trim, id0) == 3);
//		assertTrue("Restore has wrong layout", getIndexOf(trim, id3) == 0);
//	}
//
//	/**
//	 * Test that the workbench window can restore trim state from an
//	 * <code>IMemento</code> where a trim item has moved sides.
//	 * 
//	 * @throws Throwable
//	 */
//	public void testRestoreStateWithLocationChange() throws Throwable {
//		WorkbenchWindow window = openWorkbenchWindow();
//		ITrimManager trimManager = window.getTrimManager();
//		validateDefaultBottomLayout(trimManager);
//		
//		int bottomTrimCount = trimManager.getAreaTrim(SWT.BOTTOM).size();
//
//		XMLMemento state = XMLMemento
//				.createWriteRoot(IWorkbenchConstants.TAG_WINDOW);
//		IStatus rc = window.saveState(state);
//		assertEquals(IStatus.OK, rc.getSeverity());
//		IMemento trim = state.getChild(IWorkbenchConstants.TAG_TRIM);
//		assertNotNull(trim);
//
//		IMemento[] children = trim
//				.getChildren(IWorkbenchConstants.TAG_TRIM_AREA);
//		int childIdx = 0;
//		IMemento bottomTrim = null;
//		String bottomId = new Integer(SWT.BOTTOM).toString();
//		for (; childIdx < children.length; childIdx++) {
//			if (children[childIdx].getID().equals(bottomId)) {
//				bottomTrim = children[childIdx];
//				break;
//			}
//		}
//		assertNotNull(bottomTrim);
//
//		children = bottomTrim.getChildren(IWorkbenchConstants.TAG_TRIM_ITEM);
//		assertEquals(bottomTrimCount, children.length);
//		
//		// kinda fake to remove the fast view bar from the bottom
//		String id = children[0].getID();
//		children[0].putString(IMemento.TAG_ID, children[3].getID());
//
//		IMemento left = trim.createChild(IWorkbenchConstants.TAG_TRIM_AREA,
//				new Integer(SWT.LEFT).toString());
//		left.createChild(IWorkbenchConstants.TAG_TRIM_ITEM, id);
//		window.restoreState(state, window.getActivePage().getPerspective());
//		window.getShell().layout(true, true);
//
//		List windowTrim = trimManager.getAreaTrim(ITrimManager.BOTTOM);
//		assertEquals(bottomTrimCount-1, windowTrim.size());
//
//		windowTrim = trimManager.getAreaTrim(ITrimManager.LEFT);
//		assertEquals(1, windowTrim.size());
//	}
//
//	/**
//	 * These tests use 'internal' methods from the <code>WorkbenchWindow</code>.
//	 * This method ensures that the tests will fail if the <code>openTestWindow</code>
//	 * ever returns anything else
//	 * 
//	 * @return The type-safe WorkbenchWindow 
//	 */
//	private WorkbenchWindow openWorkbenchWindow() {
//		IWorkbenchWindow iw = openTestWindow();
//		assertTrue("Window must be a WorkbenchWindow", (iw instanceof WorkbenchWindow));
//		
//		return (WorkbenchWindow)iw;
//	}
//	
//	/**
//	 * Swap 2 IDs in the description.
//	 * 
//	 * @param descs
//	 *            the description array
//	 * @param pos1
//	 *            position 1, from 0
//	 * @param pos2
//	 *            position 2, from 0
//	 */
//	private void swapPostition(List trim, int pos1, int pos2) {
//		Object tmp = trim.get(pos1);
//		trim.set(pos1, trim.get(pos2));
//		trim.set(pos2, tmp);
//	}
//
//	/**
//	 * Get the position of the given trim element from the trim
//	 * 
//	 * @param trimIds The list of ids returned by the TrimManager
//	 * @param id The id of the trim to get the index of
//	 * @return The zero-based index or -1 if not found
//	 */
//	private int getIndexOf(List trimIds, String id) {
//		int index = 0;
//		for (Iterator iterator = trimIds.iterator(); iterator.hasNext();) {
//			IWindowTrim trim = (IWindowTrim) iterator.next();
//			if (id.equals(trim.getId()))
//				return index;
//			index++;
//		}
//		
//		return -1;
//	}
//	
//	/**
//	 * Ensure that all the base trim is there and has
//	 * the correct -relative- positions
//	 * 
//	 * @param descs The ordered list of trim descriptors
//	 * for the bottom trim area
//	 */
//	private void validateDefaultBottomLayout(ITrimManager trimManager) {
//		List descs = trimManager.getAreaTrim(SWT.BOTTOM);
//
//		// Must have at least 4 elements
//		assertTrue("Too few trim elements", descs.size() >= 4);
//
//		// Ensure that all the base trim is there and has
//		// the correct -relative- positions
//		int fvbIndex = getIndexOf(descs, "org.eclise.ui.internal.FastViewBar");
//		assertTrue("Fast View Bar not found", fvbIndex != -1);
//		int slIndex = getIndexOf(descs, "org.eclipse.jface.action.StatusLineManager");
//		assertTrue("StatusLine not found", slIndex != -1);
//		int hsIndex = getIndexOf(descs, "org.eclipse.ui.internal.HeapStatus");
//		assertTrue("Heap Status not found", hsIndex != -1);
//		int prIndex = getIndexOf(descs, "org.eclipse.ui.internal.progress.ProgressRegion");
//		assertTrue("Progress Region not found", prIndex != -1);
//		
//		assertTrue("Fast View out of position", fvbIndex < slIndex);
//		assertTrue("Status Line out of position", slIndex < hsIndex);
//		assertTrue("Heap Status out of position", hsIndex < prIndex);
//	}
//	
//	/**
//	 * Match the returned set of IDs exactly with expected IDs.
//	 * 
//	 * @param expectedIDs
//	 *            the string IDs in order.
//	 * @param retrievedIDs
//	 *            the current IDs in order.
//	 */
//	private void validatePositions(String[] expectedIDs, List retrievedIDs) {
//		assertEquals("Number of trim items don't match", expectedIDs.length,
//				retrievedIDs.size());
//
//		for (int i = 0; i < expectedIDs.length; ++i) {
//			assertEquals("Failed for postition " + i, expectedIDs[i],
//					((IWindowTrim) retrievedIDs.get(i)).getId());
//		}
//	}
//
//	/*
//	 * (non-Javadoc)
//	 * 
//	 * @see org.eclipse.ui.tests.util.UITestCase#doSetUp()
//	 */
//	protected void doSetUp() throws Exception {
//		super.doSetUp();
//		
//		// Ensure that the HeapStatus is showing
//		fHeapStatusPref = PrefUtil.getAPIPreferenceStore().getBoolean(
//				IWorkbenchPreferenceConstants.SHOW_MEMORY_MONITOR);
//		PrefUtil.getAPIPreferenceStore().setValue(
//				IWorkbenchPreferenceConstants.SHOW_MEMORY_MONITOR, true);
//	}
//
//	/*
//	 * (non-Javadoc)
//	 * 
//	 * @see org.eclipse.ui.tests.util.UITestCase#doTearDown()
//	 */
//	protected void doTearDown() throws Exception {
//		PrefUtil.getAPIPreferenceStore().setValue(
//				IWorkbenchPreferenceConstants.SHOW_MEMORY_MONITOR,
//				fHeapStatusPref);
//		super.doTearDown();
//	}
//
//}
